<?php 
	/**
	* Klass FILE UPLOAD HANDLER - Hanterar in och ut data gällande filuppladdning.
	* "Pratar" med databasen och hämtar ut/sätter in information där ifrån och ger tillbaka den informationen till controllern eller view. 
	*/
	class FileUploadHandler {
	
		private $name = "name";
		private $error = "error";
		private $tmp_name = "tmp_name";
		
		private $database = null;

		//----- FUNKTION: CONSTRUCT -------------------------------------------------------------------------
		public function __construct(Database $database)
		{
			$this->database = $database;
		}

		//----- FUNKTION: FILE TYPE CONTROLLER -------------------------------------------------------------------------
		/**
		 * Funktion som kontrollerar om den aktuella filen som ska laddas upp har rätt mimetyp och filändelse. Den godtar endast PDF-filer.
		 */
		public function FileTypeController($myFile)
		{
			$allowedExtension = "pdf";
			// explode delar upp min sträng, punkten bestämmer vart den ska delas.
			$myFileNameParts = explode(".", $myFile[$this->name]);
			$myFileExtension = end($myFileNameParts);

			// Här kontrollerar vi Filändelsen.
			if ($myFileExtension == $allowedExtension) {
				if ($myFile[$this->error] > 0) {
					return false;
				} return true; // Retunerar true om filen är korrekt. Annars retuneras false. 
			} else {
				return false;
			}
		}


		//----- FUNKTION: SAVE FILE ------------------------------------------------------------------------------------ 
		/**
		 * Funktion för att spara filen som användaren precis laddade upp.
		 * @param string $myFile Ett objekt som innehåller filen och all information om den.
		 * @param string $path Innehåller sökvägen till de uppladdade-filerna.
		 * @return true Om det gick bara att spara filen.
		 */
		public function SaveFile($myFile, $path)
		{
			move_uploaded_file($myFile[$this->tmp_name], $path . $myFile[$this->name]);
			return true;
		} 


		//----- FUNKTION: CONTROLL OF FILENAME -------------------------------------------------------------------------
		/**
		 * Funktion för att kontrollera om filnamnet redan existerar. 
		 * @param string $myFile Ett objekt som innehåller filen och all information om den.
		 * @param string $path Innehåller sökvägen till de uppladdade-filerna.
		 */
		public function ControllOfFilename($myFile, $path)
		{
			return file_exists($path . $myFile[$this->name]);
		}


		//----- FUNKTION: GET ALL FILES FROM DIRECTORY -----------------------------------------------------------------
		/**
		 * Funktion för att hämta ut alla filerna från "uploadedInvoice"-mappen. Hämtar ut alla filerna som har laddats up.
		 * @param string $path Innehåller sökvägen till de uppladdade-filerna.
		 * @return array $files Innehåller alla filerna som fanns i mappen.
		 */
		public function GetAllFilesFromDirectory($path)
		{
			// Öppnar en specifik mapp på servern.
			$directoryHandler = opendir($path);
			$files = array();
			
			// Först kontrollerar vi att vi kan öppna mappen, sen hämtar vi ut alla filer.
			if ($directoryHandler == true) {
				while (($currentFile = readdir($directoryHandler)) == true) {
					if ($currentFile != "." && $currentFile != "..") {
						$files[] = $currentFile;
					}
				}
			}
			// Stänger öppningen till mappen.
			closedir($directoryHandler);
			return $files;
		}


		//----- FUNKTION: LIST ALL FILES -------------------------------------------------------------------------------
		/**
		 * Funktion som skriver ut alla uppladded PDF-dokument som egna länkar. Loopar igenom FILES.
		 * @param array $files En array med alla uppladdade filer.
		 * @param string $path Sökvägen till pdf dokumenten.
		 * @return $returnstring Retunerar a-taggar med sökvägen till alla filer som loppats igenom plus namnet för varje fil.
		 */
		public function GetInvoicesByCustomerID($customerID)
		{
			$query = "SELECT * FROM invoice WHERE CustomerID = ?";
			if ($statement = $this->database->PrepareQuery($query)) {
				$statement->bind_param("i", $customerID);
				$statement = $this->database->Select($statement);
				$statement->bind_result($invoiceID, $customerID, $filename);

				$files = array();

				while ($statement->fetch()) {
					$files[] = $filename;
				}
			}
			return $files;
		}


		//----- FUNKTION: INSERT FILENAME TO TABLE INVOICE -------------------------------------------------------------
		/**
		 * Funktion som sätter in den nya fakturans namn i databasen och länkar ihop med den specifika kundes ID.
		 * @param int $customer Innehåller den specifika kundens ID.
		 * @param sting $filename Innehåller filens namn.
		 * @return bool true/false Retunerar false om det inte gick att skicka in data till databasen.
		 * @return int $nesInvoiceID Retunerar den nya fakturans ID.
		 */
		public function InsertFilenameToTableInvoice($customerID, $filename)
		{
			$query = "INSERT INTO invoice (CustomerID, Filename) VALUES(?, ?)";
			if ($insertStatement = $this->database->PrepareQuery($query)) {
				$insertStatement->bind_param("is", $customerID, $filename);
				$newInvoiceID = $this->database->Insert($insertStatement);
				return $newInvoiceID;
			}
			return false;
		}
	}
 ?>